package com.Threecharacters.inherit_.ExtendDetail;

public class ExtendDetail {
    public static void main(String[] args) {
        //1.子类Sub继承了所有的属性和方法
        Sub sub = new Sub();
//        System.out.println(sub.n1);//公共属性
//        System.out.println(sub.n2);//公共属性
//        System.out.println(sub.n3);//公共属性
//        sub.test100();//公共方法
//        sub.test200();//公共方法
//        sub.test300();//公共方法
        sub.sayHello();//sub子类特有方法

        //2.但是私有属性不能在子类直接访问，下面这两句句话报错
        //System.out.println(sub.n4);
        //sub.test400();

        //3.要通过公共的方法去访问
        //比如我在Base父类中创建一个公共方法f1调用
        //private n4和 private test400()
//        sub.f1();
        //发现一个有趣的事实：
        //在你调用子对象的时候会自动生成父类无参构造器内的内容
        //如果你注销了下面这段代码，那么相应的内容就不会第一个输出
        //        public Base() {
        //        System.out.println("Base Constructor");
        //    }
        //因此引入我们第四个细节

        //4.子类必须调用父类的构造器，完成父类的初始化
        //因为在
        //public Sub() {
        //    super();
        //    System.out.println("Sub Constructor");
        //}
        //这段代码中有super();这样一个操作

        //5.当创建子类对象时，不管使用子类的哪个构造器，默认情况下总会
        //去调用父类的无参构造器，如果父类没有提供无参构造器，则必须在子类的
        //构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,
        //否则编译不会通过.

        //如果父类没有提供无参构造器：注销之前写的无参构造器。写一个父类有参构造器
        //否则编译不会通过：上一步完成后Sub子类会报错
        //必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作：
        //在子类无参和有参构造器中写入：super(1);这行代码。问题就解决了。

//        Sub sub = new Sub();//调用无参构造器先是调用父类的无参构造器
//        System.out.println("第二个对象");
//        Sub sub1 = new Sub(10);//调用有参构造器依然是先调用父类的无参构造器

        //6.如果希望指定去调用父类的某个构造器，则显示的调用一下.（依旧使用上面这段代码）
//        Sub sub = new Sub();//调用无参构造器先是调用父类的无参构造器
//        System.out.println("第二个对象");
//        Sub sub1 = new Sub(10);//调用有参构造器依然是先调用父类的无参构造器

        //7.super在使用时，必须放在构造器第一行，super只能在构造器中使用
        //public Sub() {
        //
        //        System.out.println("Sub Constructor");
        //        super(1,2);
        //    }
        //上面这段代码报错
        //

        //8.super和this方法都只能放在构造器第一行，因此这两者不能同时在同一个方法中出现
        //public Sub(int money) {
        //        this();
        //        super(2);
        //    }
        //上面这段代码报错

        //9.Java所有类都是object的子类
        //Ctrl + H查看Sub子类可以证明

        //10.父类构造器的调用不限于直接父类！将一直网上追溯到鼻祖Object
        //暂时无法显示Object到Sub的所有内容



        //11.子类最多只能继承一个父类，那么思考：如何让A类继承B类和C类
        //将Base 继承 Base1即可


        //12.不能滥用继承，子类和父类之间必须满足is-a的逻辑关系
        // Person is a Music?
        // Person Music
        // Music extends Person
        // Animal
        // Cat extends Animal




    }
}
